EC2のプライベートサブネット移行手順をまとめてみた

EC2のプライベートサブネット移行手順をまとめてみた

Clock Icon2024.11.04

こんにちは!AWS事業本部の吉田です。

以前、EC2をプライベートサブネットに移行した際のEC2周りのアクセスについて整理した記事を執筆しました。
EC2をプライベートサブネットに移行した際のアクセス整理(インバウンド・アウトバウンド)
今回の記事では、EC2のプライベートサブネットへの移行手順を具体的にまとめてみようと思います。

移行前

プライベートサブネット移行前は以下の図の構成と仮定します。
(以前の記事の構成から簡略化しています)
EC2サブネット配置変更前(1).png

  • EC2をパブリックサブネットに配置(EC2にパブリックIPを付与)
  • HTTPSアクセスの受け口はALB
  • 作業者からEC2へ直接SSH接続している
  • RDS用のプライベートサブネットは存在している

移行後

プライベートサブネット移行後は、以下の図の構成になります。
EC2サブネット配置変更後(1).png

事前準備

概要

EC2をプライベートサブネットに移行するにあたって、いくつか事前準備が必要です。

  • EC2用のプライベートサブネットを作成
  • パブリックサブネットにNATゲートウェイを作成
  • EC2用プライベートサブネット用ルートテーブルを作成
  • EC2用IAMロールを作成

順に説明します。

EC2用のプライベートサブネットを作成

所謂Web3層アーキテクチャ構成に変更します。
プライベートサブネットを以下の2つに分離することでよりセキュアにする構成です。

  • EC2用プライベートサブネット:インターネットからの直接の通信を不可・インターネットへ向かう通信はNATゲートウェイ経由で可能なサブネット
  • RDS用プライベートサブネット:インターネットからの通信・インターネットへ向かう通信も不可なサブネット
  • 既存のプライベートサブネットをRDS用のプライベートサブネットとして利用

サブネットCIDR設計に基づいてEC2用プライベートサブネット作成します。
もしサブネットCIDR設計が特にない場合、これを機にサブネットCIDR設計を考えてみてください。
サブネットCIDR設計の1例を挙げます。

  • 単純な連番
    • 10.0.0.0/24、10.0.1.0/24、10.0.2.0/24、10.0.3.0/24
  • 用途に応じて分割
    • 例1:第3オクテットの2桁目を変える
      • パブリックサブネット(第3オクテットの2桁目が0)
        • 10.0.0.0/24、10.0.1.0/24
      • プライベートサブネット(第3オクテットの2桁目が1)
        • 10.0.10.0/24、10.0.11.0/24
    • 例2:CIDRで分割(参考記事:AWSサブネットの切り方を考えてみた)
      • パブリックサブネット(10.0.0.0/17)
        • 10.0.0.0/24、10.0.1.0/24
      • プライベートサブネット(10.0.128.0/17)
        • 10.0.128.0/24、10.0.129.0/24

今回は以下のサブネットCIDR設計でEC2用プライベートサブネットを作成していきます。

VPC CIDR
VPC 10.0.0.0/16
サブネット CIDR
パブリックサブネット(AZ-A) 10.0.0.0/24
パブリックサブネット(AZ-C) 10.0.1.0/24
RDS用プライベートサブネット(AZ-A) 10.0.10.0/24
RDS用プライベートサブネット(AZ-C) 10.0.11.0/24
EC2用プライベートサブネット(AZ-A) 10.0.20.0/24
EC2用プライベートサブネット(AZ-C) 10.0.21.0/24
  1. VPCのサブネットのページに移動し、「サブネットを作成」をクリックします。
    スクリーンショット 2024-10-29 15.44.38.png
  2. 対象のVPCを選択します。
    スクリーンショット 2024-10-29 15.45.44.png
  3. サブネットの各設定を設定します。
    サブネット名ですが、例えば既存のプライベートサブネット名が「blog-private-subnet-A」なら、「blog-private-ec2-subnet-A」のようにRDS用プライベートサブネットとは別物のプライベートサブネットであることをわかりやすくします。
    もしくは、既存のプライベートサブネットを「blog-secure-subnet-A」(private→secure)という風に更新します。
    スクリーンショット 2024-10-29 15.46.07.png
    スクリーンショット 2024-10-29 15.47.01.png
    各設定を設定しましたら「サブネットを作成」をクリックします。
  4. サブネットが作成されたことを確認します。
    スクリーンショット 2024-10-29 15.49.09.png

パブリックサブネットにNATゲートウェイを作成

プライベートサブネットのEC2がインターネットに出る際に利用します。

  1. VPCのNATゲートウェイのページに移動し、「NATゲートウェイを作成」をクリックします。
    スクリーンショット 2024-10-31 10.19.30.png
  2. NATゲートウェイの各設定を設定します。
  • サブネット:パブリックサブネットを指定してください。
  • 接続タイプ:パブリック
  • Elastic IP 割り当て:新規にEIPを作成する場合は、「Elastic IPを割り当て」をクリックします。利用していない既存のEIPがあれば、それを選択してください。
    スクリーンショット 2024-10-31 10.20.51.png
    各設定を設定しましたら、「NATゲートウェイを作成」をクリックします。
  1. NATゲートウェイが作成されたことを確認します。
    スクリーンショット 2024-10-31 10.44.41.png

ここで、NATゲートウェイの冗長化について説明します。
例えば、AZ-AのパブリックサブネットのみNATゲートウェイを配置し、AZ-A・AZ-CのプライベートサブネットにあるEC2は共にAZ-AのNATゲートウェイを通じてインターネットに出るとします。
NatGateway(シングルAZ).png
NATゲートウェイがシングルAZ構成の場合、AZ-Aで大規模障害が起きNATゲートウェイがダウンした際、プライベートサブネットにあるEC2がインターネットに出ることが出来なくなります。つまり、NATゲートウェイが単一障害点となります。
NatGateway(シングルAZ-障害).png
そのため、NATゲートウェイはマルチAZ構成にすることが望ましいです。
NatGateway(マルチAZ).png

NATゲートウェイのコスト増加を踏まえて、マルチAZ構成にするか検討してください。
NATゲートウェイを冗長化する場合は、手順の1~3を繰り返してください。
NATゲートウェイの配置サブネットを1つ目のNATゲートウェイとは違うAZのパブリックサブネットを指定します。

今回はシングルAZ構成とします。

EC2用プライベートサブネット用ルートテーブルを作成

EC2用プライベートサブネット用ルートテーブルを作成します。
作成したルートテーブルでインターネットに出るルート、つまりNATゲートウェイをターゲットにしたルートを設定します。

  1. VPCのルートテーブルのページに移動し、「ルートテーブルを作成」をクリックします。
    スクリーンショット 2024-10-31 11.24.21.png
  2. ルートテーブルの各設定を設定します。
    各設定を設定しましたら、「ルートテーブルを作成」をクリックします。
    スクリーンショット 2024-10-31 11.37.01.png
  3. 「ルート」タブが選択されていることを確認した後、「ルートを編集」をクリックします。
    スクリーンショット 2024-10-31 11.37.26.png
  4. 「ルートを追加」をクリックした後、インターネットに出るためのルートを編集します。
  • 送信先:0.0.0.0/0
  • ターゲット:「NATゲートウェイ」を選択した後、作成したNATゲートウェイを選択します。
    設定できましたら、「変更を保存」をクリックします。
    スクリーンショット 2024-10-31 11.38.16.png
  1. 「サブネットの関連付け」タブをクリックした後、「サブネットの関連付けを編集」をクリックします。
    スクリーンショット 2024-10-31 11.39.03.png
  2. 今回作成したAZ-AとAZ-CのEC2用プライベートサブネットを選択した後、「関連付けを保存」をクリックします。
    スクリーンショット 2024-10-31 11.39.22.png

今回はNATゲートウェイがシングルAZ構成のため、EC2用プライベートサブネットを一括りにしたルートテーブルを作成しました。
NATゲートウェイがマルチAZ構成の場合は、AZ-AとAZ-Cそれぞれのサブネット用のルートテーブルを作成し、各AZ用のNATゲートウェイをターゲットにしたルートを設定してください。
NatGateway(マルチAZ-ルートテーブル).png

EC2用IAMロールを作成

SSM Session Managerを利用するため、AmazonSSMManagedInstanceCoreポリシーがアタッチされたEC2用IAMロールを作成します。
既存のEC2用IAMロールがある場合は、AmazonSSMManagedInstanceCoreポリシーをアタッチしてください。
SSM Session Managerに関しては、前回の記事を参照してください。
④作業者→EC2(SSH)

  1. IAMのロールのページに移動し、「ロールを作成」をクリックします。
    1.png
  2. 信頼されたエンティティタイプは「AWSのサービス」を選択し、ユースケースは「EC2 Role for AWS Systems Manager」を選択します。
    そして、「次へ」をクリックします。
    2.png
  3. ユースケースに「EC2 Role for AWS Systems Manager」を選択すると自動的にAmazonSSMManagedInstanceCoreポリシーがアタッチされています。
    「次へ」をクリックします。
    スクリーンショット 2024-11-01 19.27.12.png
  4. ロール名を設定しましたら、「ロールを作成」をクリックします。
    スクリーンショット 2024-11-01 19.27.35.png
    スクリーンショット 2024-11-01 19.28.44.png
  5. IAMロールが作成されたことを確認します。
    スクリーンショット 2024-11-01 19.28.45.png

本作業

概要

作成済みのEC2の配置サブネットを変更することは出来ません。
そのため、以下の順番でEC2をEC2用プライベートサブネットに移行します。

  • 移行対象のEC2のAMIを作成
    • 移行対象のEC2のEBSが暗号化されていない場合、作成したAMIをコピーすることでEBSを暗号化することが可能
  • 作成したAMIからEC2用プライベートサブネット上にEC2を作成
  • ALBのターゲットグループのターゲットを作成したEC2に差し替える

順に説明します。

移行対象のEC2のAMIを作成

  1. EC2のインスタンスのページに移動した後、「アクション」→「イメージとテンプレート」→「イメージを作成」の順にクリックします。
    スクリーンショット 2024-11-01 20.40.27.png
  2. AMIの名前などの各設定を設定します。
    データの整合性を確保したい場合は「インスタンスを再起動」にチェックしてください。
    各設定を設定しましたら、「イメージを作成」をクリックします。
    スクリーンショット 2024-11-01 20.41.47.png
  3. EC2のAMIのページに移動した後、作成したAMIのステータスが「利用可能」に更新されることを確認してください。
    スクリーンショット 2024-11-01 20.51.53.png
  4. (任意)作成したAMIをコピーしEBSを暗号化します。
    対象のAMIを選択した後、「アクション」→「AMIのコピー」の順にクリックします。
    スクリーンショット 2024-11-01 20.54.48.png
  5. 「AMIコピーのEBSスナップショットを暗号化」にチェックします。
    KMSキーはEBS用のAWSマネージドキーを選択します。
    (カスタマーマネージドキーを利用する要件がある場合、作成したカスタマーマネージドキーを選択してください。)
    各設定をしましたら、「AMIをコピー」をクリックします。
    スクリーンショット 2024-11-01 20.57.40.png

作成したAMIからプライベートサブネット上にEC2を作成

  1. EC2のAMIのページに移動した後、先ほど作成したAMIを選択し「AMIからインスタンスを起動」をクリックします。
    スクリーンショット 2024-11-01 21.31.00.png
  2. EC2の各設定を設定します。
    まずはEC2の名前です。
    スクリーンショット 2024-11-01 21.32.36.png
    インスタンスタイプは移行元のEC2と同じインスタンスタイプに設定します。
    移行元のEC2のインスタンスタイプが古いファミリーの場合、現行世代のファミリーに変更することを検討してください。
    (例:t2→t3)
    キーペアですが、SSM Session Managerを利用してEC2に接続する場合は必須ではありません。
    キーペアを設定する必要がある場合は、キーペアを設定してください。
    (VSCode Remote SSHを利用してリモート開発をする場合など)
    AWS Systems Manager と VS Code Remote SSH を組み合わせて快適なリモート開発環境を作る方法
    スクリーンショット 2024-11-01 21.32.49.png
    次にネットワーク設定です。
    サブネットは作成したEC2用プライベートサブネットを指定してください。
    セキュリティグループは既存のセキュリティグループを利用するか、新規に作成してください。
    SSM Session Managerを利用する場合、22ポートのインバウンドルールが不要となります。
    今回は既存のセキュリティグループを指定します。
    スクリーンショット 2024-11-01 21.33.26.png
    「高度な詳細」をクリックします。
    そして、IAMインスタンスプロフィールに作成したIAMロールを設定します。
    スクリーンショット 2024-11-01 21.33.53.png
    メタデータのバージョンは「V2のみ(トークンは必須)」を設定します。
    特別な理由でV1を利用する理由がない限り、V2を設定することを推奨します。
    メタデータについては下記の参考記事を参照してください。
    [待望のアプデ]EC2インスタンスメタデータサービスv2がリリースされてSSRF脆弱性等への攻撃に対するセキュリティが強化されました!
    スクリーンショット 2024-11-01 21.34.13.png
    インスタンス数を設定した後、「インスタンスを起動」をクリックします。
    スクリーンショット 2024-11-01 21.34.25.png
    キーペアの設定を特にしていなかった場合、キーペアの設定について確認するポップが現れます。
    今回は「キーペアなしで続行」を選択し、「インスタンスを起動」をクリックします。
    スクリーンショット 2024-11-01 21.34.54.png
    インスタンスの起動が正常に開始されたことを確認します。
    スクリーンショット 2024-11-01 21.35.10.png
  3. インスタンスの状態が「実行中」に更新されたことを確認します。
    スクリーンショット 2024-11-03 17.59.09.png
  4. SSM Session Manegerを利用して、EC2に接続できることを確認します。
    EC2を選択した後、「接続」をクリックします。
    スクリーンショット 2024-11-03 17.59.09のコピー.png
    「セッションマネージャー」タブをクリックした後、「接続」をクリックします。
    スクリーンショット 2024-11-03 17.59.29.png
    ターミナルの画面が表示されましたら、正常に接続できております。
    スクリーンショット 2024-11-03 17.59.46.png

ALBのターゲットグループのターゲットを作成したEC2に差し替える

  1. EC2のターゲットグループのページに移動します。
    対象のターゲットグループを選択した後、「ターゲット」タブをクリックして、「ターゲットを登録」をクリックします。
    スクリーンショット 2024-11-03 18.42.08.png
  2. 作成したEC2を選択します。
    EC2への通信のポート番号を設定した後、「保留中として以下を含める」をクリックします。
    スクリーンショット 2024-11-03 18.44.01.png
    ターゲットの一覧に作成したEC2が表示されることを確認します。
    スクリーンショット 2024-11-03 18.56.15.png
  3. 作成したEC2へのヘルスチェックがHealthyに更新されることを確認します。
    スクリーンショット 2024-11-03 18.57.16.png
  4. 既存のEC2を選択した後、「登録解除」をクリックします。
    スクリーンショット 2024-11-03 18.57.39.png
  5. 既存のEC2が登録済みターゲットから削除されたことを確認します。
    スクリーンショット 2024-11-03 19.52.38.png

今回は割愛させていただきましたが、上記の作業はユーザーへの影響が大きいためメンテナンス画面を表示させることを推奨します。
ALB上でメンテナンス画面を表示させる方法は以下の参考記事を参照してください。
[新機能]EC2やS3不要!ALBだけでメンテナンス画面を表示するなど固定レスポンスが返せるようになりました!

さいごに

EC2のプライベートサブネットへの移行手順をまとめてみました。
次回は、CodeDeployとGitHub Actionsを利用してプライベートサブネットのEC2にデプロイする方法をまとめていきたいと思います。
(前回の記事の以下のセクションの話です。)
⑤GitHub→EC2(デプロイ)
どなたかのお役に立てれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.